﻿using HCMS.Extensions;
using HCMS.Utils;
using HCMS.Web.Manage.Filter;
using HCMS.Web.Manage.ServicesExtensions.SignalExt;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.WebEncoders;
using System.Text.Encodings.Web;
using System.Text.Unicode;

namespace HCMS.Web.Manage.ServicesExtensions
{
    /// <summary>
    /// 服务 核心扩展
    /// </summary>
    public static class CoreExtension
    {
        /// <summary>
        /// MVC 扩展
        /// </summary>
        /// <returns></returns>
        public static IServiceCollection AddCustomMVC(this IServiceCollection services)
        {
            var isDevelopment = services.GetHostingEnvironment().IsDevelopment();

            // Options 动态内容不使用编码
            services.Configure<WebEncoderOptions>(options =>
            {
                options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All);
            });

            var mvcBuilder = services.AddControllersWithViews(options =>
                              {
                                  // 添加 全局过滤器
                                  options.Filters.Add<GlobalExceptionFilter>();
                              }).AddJsonOptions(options =>
                                // Json 序列化 增加 中文处理，设置后，输出到页面的中文内容才不会被编码。
                                // 例如：原来显示【\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F】，设置后可以正常显示【微信小程序】
                                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
                            );

            // 配置 SignalR 中心
            services.AddSignalR();
            services.AddSingleton<IUserIdProvider, NameUserIdProvider>();

            // 启用 运行时编译
            /*
                AddRazorRuntimeCompilation()：
                    加上这个，在开发阶段，cshtml 页面修改了，直接刷新浏览器即可看到效果。
                    没有这个，则需要重新编译后才能看到效果。 建议开发期间使用 热重载，而不是使用 Razor 运行时编译。

                *** 仅在 开发环境下 启用 ***
                
                文档地址：https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/view-compilation?view=aspnetcore-8.0&viewFallbackFrom=aspnetcore-3.0&tabs=visual-studio
             */
            if (isDevelopment)
            {
                mvcBuilder.AddRazorRuntimeCompilation();
            }

            return services;
        }

        /// <summary>
        /// Redis 配置
        /// </summary>
        /// <returns></returns>
        public static IServiceCollection AddCustomRedisContext(this IServiceCollection services)
        {
            services.AddStackExchangeRedisCache(options =>
            {
                options.Configuration = ConfigUtil.GetValue("ConnectionStrings:Redis");
                options.InstanceName = "HcmsManage:";
            });

            return services;
        }

        /// <summary>
        /// Session 上下文
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public static IServiceCollection AddCustomSessionContext(this IServiceCollection services)
        {
            services.AddSession(options =>
            {
                options.IdleTimeout = TimeSpan.FromSeconds(ConfigUtil.GetValue("Session:Timeout").ToInt(60));
                options.Cookie.HttpOnly = true;
                options.Cookie.IsEssential = true;
            });

            return services;
        }
    }
}
